package main
import (
	"fmt"
)

//结构体的使用事项和注意细节
type Point struct {
	x int
	y int
}
type Rect struct {
	leftUp,rightDown Point
}
type Rect2 struct {
	leftUp,rightDown *Point
}
func main(){
	r1 := Rect{Point{1,2},Point{3,4}}
	//r1 有4个int，在内存中是连续分布的！！！！；int类型是8个字节！！！
	fmt.Printf("r1'address : %p\n",&r1)
	fmt.Printf("r1.leftUp.x 地址：%p\n",&r1.leftUp.x) //0xc0000a0120
	fmt.Printf("r1.leftUp.y 地址：%p\n",&r1.leftUp.y) //0xc0000a0128
	fmt.Printf("r1.rightDown.x 地址：%p\n",&r1.rightDown.x) //0xc0000a0130
	fmt.Printf("r1.rightDown.y 地址：%p\n",&r1.rightDown.y) //0xc0000a0138

	//r2 有两个 *Point的引用类型，其中这两个的地址也是连续的！！！！但是他们指向的地址不一定是连续的！！！
	r2 := Rect2{&Point{1,2},&Point{3,4}}
	//本身地址是连续的
	fmt.Printf("r2.leftUp 本身地址：%p\n",&r2.leftUp) //
	fmt.Printf("r2.rightDown 本身地址：%p\n",&r2.rightDown) //
	//指向的地址不一定连续！
	fmt.Printf("r2.leftUp 指向地址：%p\n",r2.leftUp) //
	fmt.Printf("r2.rightDown 指向地址：%p\n",r2.rightDown) //

	fmt.Printf("r2.leftUp.x 地址：%p\n",&r2.leftUp.x) //
	fmt.Printf("r2.leftUp.y 地址：%p\n",&r2.leftUp.y) //
	fmt.Printf("r2.rightDown.x 地址：%p\n",&r2.rightDown.x) //
	fmt.Printf("r2.rightDown.y 地址：%p\n",&r2.rightDown.y) //


	
}